import 'package:dio/dio.dart';
import 'package:sl_flutter/utils/tokenManager.dart';

class NetworkService {
  final _dio = Dio();

  NetworkService() {
    // 配置基础地址
    _dio.options.baseUrl = 'https://slwl-api.itheima.net';
    // 设置连接超时时间
    _dio.options.connectTimeout = const Duration(seconds: 50);
    // 设置接收超时时间
    _dio.options.receiveTimeout = const Duration(seconds: 50);
    // 设置请求头
    _dio.options.headers = {'Content-Type': 'application/json'};
    // 添加请求和响应拦截器
    _addInterceptors();
  }

  /** 
   * 发起GET请求
   * [url] 请求的URL
   * [params] 请求的查询参数
   * 返回解析后的响应数据或错误信息
   */
  Future<dynamic> get(String url, {Map<String, dynamic>? params}) async {
    try {
      final response = await _dio.get(url, queryParameters: params);
      return handleResponse(response);
    } catch (e) {
      // return handleError(e);
    }
  }

  /** 
   * 发起POST请求
   * [url] 请求的URL
   * [data] 请求的主体数据
   * 返回解析后的响应数据或错误信息
   */
  // 设置formdata为可选参数，允许传递data参数

  // Future<dynamic> post(String url, {Map<String, dynamic>? data}) async {
  //   try {
  //     final response = await _dio.post(
  //       url,
  //       data: data,
  //     );
  //     return handleResponse(response);
  //   } catch (e) {
  //     return handleError(e);
  //   }
  // }

  /** 
   * 发起POST请求
   * [url] 请求的URL
   * [data] 请求的主体数据
   * 返回解析后的响应数据或错误信息
   */
  Future<dynamic> post(String url, dynamic data) async {
    try {
      final response = await _dio.post(url, data: data);
      return handleResponse(response);
    } catch (e) {
      // return handleError(e);
    }
  }

  Future<dynamic> delete(
    String url,
  ) async {
    try {
      final response = await _dio.delete(
        url,
      );
      return handleResponse(response);
    } catch (e) {
      // return handleError(e);
    }
  }

  Future<dynamic> put(String url, {Map<String, dynamic>? data}) async {
    try {
      final response = await _dio.put(url, data: data);
      return handleResponse(response);
    } catch (e) {
      // return handleError(e);
    }
  }

  // 其他 HTTP 方法封装...

  void _addInterceptors() {
    _dio.interceptors.add(InterceptorsWrapper(
      onRequest: (options, handler) async {
        // 请求拦截器：添加公共请求参数、token 等
        // todo
        // 拿到token
        final token = TokenManager().getToken() ?? '';
        // 设置请求头
        if (token.isNotEmpty) {
          options.headers['Authorization'] = token;
        }
        return handler.next(options);
      },
      onResponse: (response, handler) {
        // 响应拦截器：统一处理成功响应
        return handler.next(response);
      },
      onError: (DioException error, handler) {
        // 响应拦截器：统一处理错误响应
        return handler.next(error);
      },
    ));
  }

  dynamic handleResponse(Response response) {
    if (response.statusCode! >= 200 && response.statusCode! < 300) {
      return response.data;
    } else {
      throw Exception('请求失败，状态码：${response.statusCode}');
    }
  }

  // dynamic handleError(error) async {
  //   if (error is DioException) {
  //     if (error.type == DioExceptionType.connectionTimeout ||
  //         error.type == DioExceptionType.receiveTimeout) {
  //       throw Exception('网络连接超时');
  //     } else if (error.type == DioExceptionType.badResponse) {
  //       if (error.response?.statusCode == 401) {
  //         // 401 错误处理
  //         // 清除token并跳转到登录页
  //         await TokenManager().removeToken();
  //         // 跳转到登录页
  //         eventBus.fire(MyEvent(''));

  //         // throw Exception('未授权访问');
  //       } else {
  //         throw Exception('响应错误，状态码：${error.response?.statusCode}');
  //       }
  //     } else {
  //       // throw Exception('网络请求错误：$error');
  //       // ToastUtil.showError('网络请求错误');
  //     }
  //   } else {
  //     throw Exception('未知错误：$error');
  //   }
  // }
}

final https = NetworkService();
